package br.com.unirio.autocar.servicos;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import br.com.unirio.autocar.dados.RepositorioDeAutomovel;
import br.com.unirio.autocar.dados.RepositorioDeFuncionario;
import br.com.unirio.autocar.dados.RepositorioDeModelo;
import br.com.unirio.autocar.dados.RepositorioDePagamento;
import br.com.unirio.autocar.dados.RepositorioDeProduto;
import br.com.unirio.autocar.dados.RepositorioDeProprietario;
import br.com.unirio.autocar.dados.RepositorioDeTransacao;
import br.com.unirio.autocar.modelo.Automovel;
import br.com.unirio.autocar.modelo.Funcionario;
import br.com.unirio.autocar.modelo.Modelo;
import br.com.unirio.autocar.modelo.Pagamento;
import br.com.unirio.autocar.modelo.Produto;
import br.com.unirio.autocar.modelo.Proprietario;
import br.com.unirio.autocar.modelo.TipoPagamento;
import br.com.unirio.autocar.modelo.TipoTransacao;
import br.com.unirio.autocar.modelo.Transacao;

public class ServicoCompraAutomovel
{
    RepositorioDeFuncionario todosOsFuncionarios;
    RepositorioDeAutomovel todosOsAutomoveis;
    RepositorioDeTransacao poolDeTransacoes;
    RepositorioDeProprietario todosOsProprietarios;
    RepositorioDePagamento todosOsPagamentos;
    RepositorioDeModelo todosOsModelos;
    RepositorioDeProduto todosOsProdutos;
    Proprietario proprietario;

    Transacao transacao;
    Pagamento pagamento;

    public ServicoCompraAutomovel()
    {
	super();
	this.todosOsFuncionarios = new RepositorioDeFuncionario();
	this.todosOsAutomoveis = new RepositorioDeAutomovel();
	this.poolDeTransacoes = new RepositorioDeTransacao();
	this.todosOsProprietarios = new RepositorioDeProprietario();
	this.todosOsPagamentos = new RepositorioDePagamento();
	this.todosOsModelos = new RepositorioDeModelo();
	this.todosOsProdutos = new RepositorioDeProduto();
	this.pagamento = new Pagamento();
	this.transacao = new Transacao();
    }

    public void adicionarNovoAutomovelASerComprado(
	    String descricao,
		BigDecimal valorParaVenda,
		Proprietario proprietarioAtual,
		Modelo modelo,
		int anoFabricacao,
		String placa,
		String documentacao,
		String cor)
    {
	this.proprietario = proprietarioAtual;

	Produto produto = new Produto(valorParaVenda, descricao);
	Automovel automovel = new Automovel(produto, proprietario, modelo, anoFabricacao, placa, documentacao, cor);
	todosOsProdutos.salvarProduto(produto);
	todosOsAutomoveis.salvarAutomovel(automovel);
	this.transacao.setProduto(produto);

    }

    public String obterProprietarioAPartirDePessoa()
    {
	Proprietario proprietario = todosOsProprietarios.obterProprietarioAPartirDeIdPessoa(transacao.getPessoa());
	return proprietario.toString();
    }

    public void adicionarFuncionarioDaTransacao(Funcionario funcionario)
    {
	Funcionario funcionarioObtido = todosOsFuncionarios.obterFuncionarioAPartirDeId(funcionario.getIdFuncionario());
	this.transacao.setFuncionario(funcionarioObtido);

    }

    public void adicionarQuantidadeDeUmAutomovel()
    {
	this.transacao.setQuantidadeProduto(1);
    }

    public List<Funcionario> obterTodosOsFuncionarios()
    {
	return todosOsFuncionarios.obterTodos();

    }

    public List<Automovel> obterTodosOsAutomoveis()
    {
	return todosOsAutomoveis.obterTodos();
    }

    public List<Proprietario> obterTodosOsProprietarios()
    {
	return todosOsProprietarios.obterTodos();
    }

    public void adicionarPagamentoTransacao(Pagamento pagamento)
    {

	this.transacao.setPagamento(pagamento);
    }

    public void adicionarDataTransacao(Date data)
    {
	this.transacao.setDataTransacao(data);
    }

    public void adicionarPessoaTransacao(Proprietario proprietario)
    {
	this.transacao.setPessoa(proprietario.getPessoa());
    }

    public Transacao confirmarEAguardarPagamento() throws Exception
    {
	this.transacao.setTipoTransacao(TipoTransacao.COMPRA_AUTOMOVEL);
	this.transacao.setPagamento(pagamento);
	poolDeTransacoes.salvarTransacao(transacao);
	return this.transacao;

    }

    public void efetivarTransacao()
    {

	if (this.transacao.getPagamento() != null)
	{
	    alterarProprietarioAutomovel();
	    Pagamento pagamentoAlterado =
		    todosOsPagamentos.obterPagamentoAPartirDeId(this.transacao.getPagamento().getIdPagamento());
	    pagamentoAlterado = this.transacao.getPagamento();
	    todosOsPagamentos.alterarPagamento(pagamentoAlterado);
	    this.poolDeTransacoes.alterarTransacao(this.transacao);
	}

    }

    public void adicionarValorTransacao(BigDecimal valorTransacao, Double desconto)
    {
	BigDecimal valorTotal = valorTransacao.subtract((BigDecimal.valueOf(desconto).divide(BigDecimal.valueOf(100))).multiply(valorTransacao));
	this.transacao.setValorTransacao(valorTotal);
    }

    public Transacao getTransacao()
    {
	return transacao;
    }

    // Aqui colocaremos a AutoCar como Proprietaria do Automovel
    private void alterarProprietarioAutomovel()
    {
	Automovel automovel = todosOsAutomoveis.obterAutomovelAPartirDeIdProduto(this.transacao.getProduto());
	automovel.setProprietario(todosOsProprietarios.obterProprietarioAutoCar());
	this.todosOsAutomoveis.alterarAutomovel(automovel);
    }

    public Automovel retornarAutomovelAPartirDeProduto(Produto produto)
    {
	return todosOsAutomoveis.obterAutomovelAPartirDeIdProduto(produto);
    }

    public void adicionarDataPagamento(Date date)
    {
	this.transacao.getPagamento().setDataPagamento(date);
    }

    public void adicionarTipoPagamento(TipoPagamento tipoPagamento)
    {

	this.transacao.getPagamento().setTipoPagamento(tipoPagamento);
    }

    public void adicionarStatusPagamento(String status)
    {
	this.transacao.getPagamento().setStatusPagamento(status);
    }

    public List<Automovel> obterTodosOsAutomoveisNaoSaoAutoCar()
    {
	return this.todosOsAutomoveis.obterTodosOsAutomoveisAutoCar();
    }

    public List<Modelo> obterTodosOsModelos()
    {
	return this.todosOsModelos.obterTodos();
    }
}
